#include<iostream>
#include<regex>
#include<string>


// int main()
// {
//     std::string _src = "/numbers/1234";
//     std::smatch _match;
//     std::regex e("/numbers/(\\d+)");
//     std::regex_match(_src,_match,e);

//     for(auto& s : _match)
//     {
//         std::cout << s << std::endl;
//     }

//     //result:
//     // "/numbers/1234"
//     // "1234"

//     return 0;
// }


int main()
{
    std::string _src = "get /login http/1.1\r\n";
    std::smatch _matches;
    // std::regex e("(GET|HEAD|POST|PUT|DELETE|get|head|post|put|delete) ([^?]*)\\?(.*) (HTTP|http/1\\.\\d+)");
    // std::regex e("(GET|HEAD|POST|PUT|DELETE|get|head|post|put|delete) ([^?]*)\\?(.*) (HTTP|http/1\\.[01])");
    //std::regex e("(GET|HEAD|POST|PUT|DELETE|get|head|post|put|delete) ([^?]*)\\?(.*) (HTTP|http/1\\.[01](?:\r\n|\n)?)");
    std::regex e("(GET|HEAD|POST|PUT|DELETE|get|head|post|put|delete) ([^?]*)(?:\\?(.*))? (HTTP|http/1\\.[01](?:\r\n|\n))?");
    // (GET|HEAD|POST|PUT|DELETE|get|head|post|put|delete)表示匹配并提取请求方法 
    // [^?]表示匹配非问号字符 
    // .表示匹配非\r\n所有字符 
    // *表示匹配0次或多次
    // \\?表示原始?
    // \\.表示原始.
    // [01]表示匹配0或者1
    // ?:表示匹配但不提取
    // 最后的?表示匹配前面的表达式0次或1次
    std::regex_match(_src,_matches,e);

    for(auto& s : _matches)
    {
        std::cout << s <<std::endl;
    }

    return 0;
}